<?php
/**
 * form表单中单元项目，放置在controls数组中
 * Date: 2020/11/2
 * Time: 14:08
 * array:  1. 需要在数据库中配置["admin"],注意不能带key； 2.模型中类型转换 array，或者 输入时json_encode入库，输出时json_decode出库
 * image: 1.设置获取器和修改器，转换id 和 url
 */

namespace plugin\admin\app\common\xbuilder\widget;


class FormItemType
{
    private static $payload = "return {\n    ...payload,\n    status: payload.code === 200 ? 0 : payload.code\n}";
    public static function __callStatic($name, $arguments)
    {
        return $arguments[0];
    }

    public static function init($attrs)
    {
        $attrs = is_array($attrs) ? $attrs : ['type'=>$attrs];

        try {
            $method = (string)$attrs['type'];
            $method = str_replace('-', '_', $method);
            $data = self::$method($attrs);
            $data['type'] = $attrs['type'];
            return $data;
        } catch (\Exception $e) {
            return $attrs;
        }
    }
    //amis-数据输入-formItem表单项参数
    public static function getFormItem($name, $attrs, $title, $required = false, $hidden = false){
        $item['name'] = $name;
        $item['size'] = 'lg';
        $item = array_merge($item, self::init($attrs));
        if (is_array($title)) {
            $item['label'] = $title['title'];
            $item['size'] = $title['size'] ?? ''; //'xs' | 'sm' | 'md' | 'lg' | 'full'
            $item['labelRemark'] = $title['remark'] ?? '';
            $item['placeholder'] = $title['placeholder'] ?? '';
        } else {
            $item['label'] = $title;
//            $item['size'] = 'lg';
        }

        if (is_array($required)) {
            $item['required'] = $required['required'];
            $item['requiredOn'] = isset($required['requiredOn']) ? $required['requiredOn'] : '';    //条件必填 other.number > 1 校验
            $item['validations'] = $required['rule'];    //格式类型校验 {"isNumeric": true, "minimum": 10} or isNumeric,minimum:10
            $item['validationErrors'] = $required['errMsg'];    //自定义校验信息 {"isNumeric": '同学，请输入数字哈', "minimum": '同学，最少输入$1以上的数字哈'} or isNumeric,minimum:10
        } else {
            $item['required'] = $required;
        }

        if (is_array($hidden)) {
            $item = array_merge($item, $hidden);
        } else {
            $item['hidden'] = $hidden;
        }
        return $item;
    }
    /**
     * [
     * 'type'=>'select',
     * 'multiple'=>true,       //是否多选
     * 'creatable'=>true,      //是否有增加选项（适用单选 且 label = value的情况）
     * 'addControls'=>true,    //是否有增加选项（适用多选/单选 且 label != value的情况）
     * 'addApi'=>url('addurl'),//选项添加-请求地址
     * 'options'=>[
     * ['label'=>'渠道', 'value'=>'1'], ['label'=>'外链', 'value'=>'2'], ['label'=>'审核', 'value'=>'3'],
     * 'https://www.baidu.com',
     * 'https://www.qq.com',
     * 'https://www.alibaba.com'
     * ]
     * @return mixed
     */
    public static function select($attrs)
    {
        if ($attrs['multiple']) {  //多选
            $item['multiple'] = $attrs['multiple'];
            $item['joinValues'] = false;
            $item['extractValue'] = $attrs['multiple'];
        }
        if ($attrs['addApi']) {  //选项添加
            $item['addApi'] = [
                'method' => 'post',
                'url' => $attrs['addApi'],
                'headers' => [
                    'X-Requested-With' => 'XMLHttpRequest'
                ]
            ];
            if (self::$payload){
                $item['addApi']['adaptor'] = self::$payload;
            }
        }
        if ($attrs['addControls']) {   //是否动态增加选项（适用多选/单选 且 label != value的情况）
            $item['creatable'] = true;
            $item['addControls'] = is_array($attrs['addControls']) ? $attrs['addControls'] : [
                ['type' => 'text', 'name' => 'label', 'label' => '选项标题',],
                ['type' => 'text', 'name' => 'value', 'label' => '选项值',]
            ];
        }
        if (is_array($attrs['options'])) {
            $item['options'] = $attrs['options'];
        } else {
            $item['source'] = $attrs['options'];
        }
        $item = array_merge($item, $attrs);
        return $item;
    }

    /**
     * [
     * 'type'=>'array',
     * 'addable'=>true,    //默认:true,是否可新增
     * 'addButtonText'=>'新增',  //默认:新增,新增按钮文字
     * 'removable'=>true,  //默认:true,是否可删除
     * 'draggable'=>true,  //默认:false,是否可以拖动排序, 需要注意的是当启用拖动排序的时候，会多一个$id 字段
     * 'minLength'=>1,     //是否可删除
     * 'maxLength'=>3,     //是否可删除
     * 'items'=>[  //配置单项表单类型
     * 'type'=>'text',
     * ]
     * ]
     */
    public static function array($attrs)
    {
        $item = [
            'type' => 'array',
            'items' => [  //配置单项表单类型
                'type' => 'text'
            ]
        ];
        $attrs = array_merge($item, $attrs);
        return $attrs;
    }

    /**
    [
        'buttons' => [],
    ]
     * @param $attrs
     * @param array $buttons
     * @return mixed
     */
    public static function button_group($attrs)
    {
        if (!$attrs['buttons']) {
            return self::select($attrs);
        } else {
            return $attrs['buttons'];
        }
    }

    /**
    [
        'label' => '按钮',
        'type' => 'action',
        'level' => 'info',   //link、primary、secondary、info、success、warning、danger、light、dark、default
        'icon' => 'fa fa-plus',
        'size' => 'xs、sm、md、lg',
        'api' => 'https://xxx',
        'actionType' => 'url',  //ajax、link、url、drawer、dialog、confirm、cancel、prev、next、copy、close
        'url' => 'https://xxx',
    ]
     * @param $attrs
     * @return array
     */
    public static function button($attrs){
        $item = [
            'label' => '按钮',
            'type' => 'action',
            'level' => 'info'
        ];
        $attrs = array_merge($item, $attrs);
        return $attrs;
    }

    /**
    [
        'label' => '勾选框',
        'option' => '选项说明',
        'trueValue' => 1,   // 默认true, 映射值
        'falseValue' => 0,  // 默认false, 映射值
    ]
     * @param $attrs
     * @return array
     */
    public static function checkbox($attrs){
        $item = [
            'label' => '勾选框',
            'option' => '选项说明',
        ];
        $attrs = array_merge($item, $attrs);
        return $attrs;
    }

    /** TODO 待处理上传
     * app/admin/common/upload/image
     * @param $attrs
     * @return array|string[]
     */
    public static function image($attrs){
        $url = '/app/admin/common/upload/image';
        $item = [
            'reciever' => $url
        ];
        $attrs = array_merge($item, $attrs);
        return $attrs;
    }

    /**
     * 日期组件
     * @param $attrs
     * @return array
     */
    public static function date($attrs)
    {
        $item = [
            "format"=> "YYYY-MM-DD" //Y-m-d H:i:s
        ];
        $attrs = array_merge($item, $attrs);
        return $attrs;
    }

    /**
     * 日期时间组件
     * @param $attrs
     * @return array
     */
    public static function datetime($attrs)
    {
        $item = [
            "format"=> "YYYY-MM-DD HH:mm:ss" //Y-m-d H:i:s
        ];
        $attrs = array_merge($item, $attrs);
        return $attrs;
    }
}
